Ana içeriğe geç

Structs (Yapılar)

Struct lar türkçeye yapılar olarak çevrilmektedir. Aynı alandaki verileri tek başlık altında birleştirerek tek değeri ile erişmemizi sağlayan yapılardır. Rust 3 tip struct yapısına sahiptir. Bunlar:

  • name field: Tüm komponentlere isim vermektedir.
  • tuple like: Tüm komponentleri oluşma sıralarına göre sınıflandırır.
  • unit like: Aslında hiçbir componenti yoktur.

olmaktadır.

1) Name Field Struct

Struct yapılarını struct anahtar kelimesi ve yanına Camel Case ile yazılan isimle tanımlanmaktadırlar.

struct Kullanici {

}

main() fonksiyonu dışına herhangi bir fonksiyonun içinde olmadan yazılabilirler.

Structlar daha önce de belirttiğimiz gibi kendimizin veri tipi oluşturmamızı sağlayan yapılardır. Name Field Struct yapılarında ise veri tipi içerisindeki kaydedileceği ismi ve verinin hangi tipe sahip olacağını tanımlamamız gerekmektedir.

struct Kullanici{
aktiflik_durumu: bool,
kullanici_adi: String,
giris_yapma_sayisi: u32,
}

Artık Kullanici adında bir veri tipi oluşturduk. Bu veri tipine sahip bir değişen oluşturmak istediğimizde alt kısımda olduğu gibi bir yapı kullanmamız gerekmektedir:

fn main(){
let kullanici1 = Kullanici{aktiflik_durumu: true, kullanici_adi: String::from("Widget"), giris_yapma_sayisi: 0}
}

Artık kullanici1 adında ve Kullanici türünde bir değişken ürettik. Peki bu değişkenin içerisindeki verilere nasıl erişiyoruz? Burada karşımıza . işlemleri gelmekte. Struct ile oluşturduğumuz değişkenlerde bu değişkenin yanına . koyarak istediğimiz özelliğine erişebiliriz.

println!("Kullanıcı aktif mi? {}", kullanici1.aktiflik_durumu);

println!("Kullanıcının ismi ne? {}", kullanici1.kullanici_adi);

println!("Kullanıcı kaç kez sisteme girmiş? {}", kullanici.giris_yapma_sayisi)

Aynı zamanda belki de Kulanici tipinde bir değişkeni bizim için oluşturacak bir fonksiyon da yazabiliriz.

fn kullanici_olustur(kullanici_adi: String) -> Kullanici {
Kullanici{
kullanici_adi,
aktiflik_durumu : true,
giris_yapma_sayisi : 1,
}
}

Bu şekilde kullanıcımızı fonksiyon kullanarak oluşturabiliriz. Bu kısımda kullanici_adi değeri dışındaki parameterlere : ile bir değer tanımladığımızı görüntüleyebilirsiniz. Bu durumun nedeni Rust'ın parametre olarak girilen kullanici_adi değişkeni ile Kullanici struct'ındaki anahtarın aynı olduğunu fark edecek kadar zeki olup otomatik atama sağlamasıdır. Bu yapı yerine kullanici_adi: kullanici_adi da diyebiliriz ancak gerek bulunmamakta.

Fonksiyonumuzu oluşturduğumuza göre artık çağıra da biliriz.

fn main(){
let kullanici2 = kullanici_olustur(String::from("İrem"));
println!("{}", kullanici1.kullanici_adi); // İrem
}

2) Tuple Like Structs

Tuple like structs değerleri daha önce de söylediğimiz üzere name field'a nazaran isimle değil eklenme sırası ile içindeki değişkenleri tanımlamaktadır.

Bu tipte bir tuple struct oluşturmak için şu şekilde bir tanım yapabiliriz.

struct Koordinatlar(i32,i32,i32);

Sonrasında da herhangi bir fonksiyon içeisinde aynı şekilde çağırabilirim ve içerisindeki değerlere . notasyonu ve index numarası ile ulaşabilirim:

fn main(){
let kordinat_bilgisi = Koordinatlar(1,2,3);
println!("{}",kordinat_bilgisi.0); //1
}

3) Unit Like Struct

Peki içlerinde veri olmayan Unit like struct değerleri nasıl tanımlanmakta? Bu değerleri sadece struct anahtar kelimesi ve CamelCase isimlendirme ile tanımlayabiliriz. İç kısmına birşey koymamamız gerekmektedir.

struct unitTipiStruct;

Peki bu yapılar nerede kullanılmaktadır? Aslında bu yapıyı biz öncesinde kullandık. Bir vektör içerisine belirli sayılar arasında değer oluşturmak için 1..5 ifadesini kullandık. Burada yer alan .. yapısı struct içerisindeki range yani aralık değerinin kısaltması olmaktadır. Yani açılınca `1..5 => Range {start:1 ,end:5} ifadesine karşılık gelmektedir.

Bu tip structları ileride daha ayrıntılı görecek olsak da şu anlık bizim için önemli olanlar name field struct yapıları olmaktadır.